package metar;

/**
 * Luftdruck
 * @author Michel Metzger, Java-Kurs 2013
 * @version 1.0.0
 *
 */
public class PressureMetar implements MetarParamInterface {

	/**
	 * Luftdruck in hPa
	 */
	private double pressure;

	/**
	 * Originalwert aus der Metar-info
	 */
	private String origParam;

	/**
	 * Konstruktor
	 */
	public PressureMetar() {
		pressure = 0;
	}

	/**
	 * Liefert den Luftdruck in hPa
	 * @return
	 */
	public double getPressure() {
		return pressure;
	}

	/**
	 * Liefert den original Parameter aus dem MetarInfo
	 * @return
	 */
	public String getOrigParam() {
		return origParam;
	}

	/**
	 * Liefert true, wenn der angegebene Parameter eine Luftdruckangabe enthält
	 * @param val
	 * @return
	 */
	public static boolean isValid(String val) {
		if (val == null) {
			return false;
		}

		val = val.toUpperCase();
		if (val.matches("SLP\\d{3}") || val.matches("A|Q\\d{4}")) {
			return true;
		}
		
		return false;
	}

	/**
	 * Holt den Luftdruck aus dem angegebenen Parameter und evtl. Umrechnungen durch
	 * @return
	 * @throws MetarParseException
	 */
	@Override
	public PressureMetar parseParam(String val) throws MetarParseException {
		if (!isValid(val)) {
			throw new MetarParseException("Exception while parsing pressure!");
		}

		/**
		 * Samples:
		 * Q1012 = QNH von 1012 hPa, also der am Platz herrschende Luftdruck nach der Standardatmosph�re reduziert auf Meereshöhe beträgt 1012 Hektopascal
		 * SLP176 = indicates the current barometric pressure extrapolated to sea level is 1,017.6 hPa (30.05 inHg).
		 */
		
		try {
			origParam = val;

			val = val.toUpperCase();
			if (val.matches("SLP\\d{3}")) {
				pressure = Double.valueOf(val.substring(3)) / 10.0 + 1000.0;
			} else if (val.startsWith("Q")) {
				pressure = Double.valueOf(val.substring(1));
			} else if (val.startsWith("A")) {
				// Umrechnen von inHG in hPa => 1 inHG = 33.864 hPa
				pressure = Double.valueOf(val.substring(1)) * 0.33864;
			}
		} catch (NumberFormatException e) {
			if (MetarInfo.isDebugMode()) {
				e.printStackTrace();
			}
			throw new MetarParseException("Exception while parsing pressure!", e);
		}
		
		if (MetarInfo.isDebugMode()) {
			System.out.println("*** Pressure.pressure=" + pressure + " hPa");
		}
		
		return this;
	}

}
